package org.xiaojl.wechat.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.xiaojl.common.base.BaseController;
import org.xiaojl.wechat.WeChatConstants;
import org.xiaojl.wechat.WeChatKit;
import org.xiaojl.wechat.service.WeChatService;

/**
 * 微信服务器验证
 */
@Controller
@RequestMapping("/weChat")
public class WeChatController extends BaseController{
	private static final Logger log = LoggerFactory.getLogger(WeChatController.class);
	@Autowired
	private WeChatService weChatService;
	
	/**
	 * 验证消息的确来自微信服务器:<br>
	 * 	若确认此次GET请求来自微信服务器，请原样返回echostr参数内容，则接入生效，成为开发者成功，否则接入失败。
	 * 
	 * @throws IOException
	 */
    @RequestMapping(value = "/sign", method = RequestMethod.GET)
    public void signature() throws IOException {
    	// 微信加密签名
        String signature = request.getParameter("signature");
        // 时间戮
        String timestamp = request.getParameter("timestamp");
        // 随机数
        String nonce = request.getParameter("nonce");
        // 随机字符串
        String echostr = request.getParameter("echostr"); 
        log.debug("微信加密签名："+signature+" ,时间戳："+timestamp +" ,随机数："+nonce+" ,随机字符串："+echostr);
        
        PrintWriter out = response.getWriter();
        // 通过检验 signature 对请求进行校验，若校验成功则原样返回 echostr，表示接入成功，否则接入失败
       if(WeChatKit.checkSignature(signature, timestamp, nonce)){
    	   log.debug("微信服务器消息验证成功！");
           out.print(echostr);
       }
       
       out.close();
       out = null;
    }
    
    
    /**
     * 用户登录<br>
		1、引导用户进入授权页面同意授权，获取code <br>
		2、通过code换取网页授权access_token（与基础支持中的access_token不同） <br>
		3、如果需要，开发者可以刷新网页授权access_token，避免过期 <br>
		4、通过网页授权access_token和openid获取用户基本信息（支持UnionID机制） <br>
     */
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String login(){
    	String weChatCode = request.getParameter("code");
    	
    	Map<String,String> weChatUserInfo = weChatService.getUserInfoByWeChatCode(weChatCode);
    	if(weChatUserInfo ==null 
    			|| !weChatUserInfo.containsKey("openid ") 
    			|| weChatUserInfo.get("openid")==null){
    		String loginUrl = WeChatConstants.wechatLoginUrl;
    		//用户同意授权，获取code:由于授权操作安全等级较高，所以在发起授权请求时，微信会对授权链接做正则强匹配校验，如果链接的参数顺序不对，授权页面将无法正常访问
    		return "redirect:https://open.weixin.qq.com/connect/oauth2/authorize?appid="+WeChatConstants.APP_ID+"&redirect_uri="+loginUrl+"&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
    	}
    	
    	//去判断该openID是否已经授权过，即数据库中是否具有openId对应的用户信息，
    	//如果没有则保持到数据库中，同时获取用户在平台中的信息
		
    	//登录业务逻辑
    	
    	//跳转到主页
    	return "redirect:framework/index";
    }
    
    
}
